/**
 * Created by JinMiao
 * 2017/7/7.
 */
fun main(args: Array<String>) {

//    println(p)
//    println(ifTest(a)) //print 5

//    println(cashTest(s)) //print 4
//    whileTest(array) //print 1,2,3,4,5
//      forTest(array,hashmap)
//    testNull(null)
//    testwhen(null)
//    tryCatchTest()
//    println(hashmap.name())


    println(inlineTest { 1 })

}

var a:Int = 5   //改类型不能被设置为null
var nA:Int?=null //这样的写法可以被设置为null
var l = 55L
var s = "haha"
var b = "vv$s"
var array:Array<Int> = arrayOf(1,2,3,4,5)
var hashmap:HashMap<Int,Int> = hashMapOf(Pair(1,1),Pair(2,2))
val p: String by lazy {
    println("init")
    "haha"
}

fun baseType(){
    println(b) //print  vvhaha
}

fun ifTest(i:Int):Int= if(i==5) i else 0

fun cashTest(any: Any):Int?{
    if (any is String)
        return any.length
    return null
}

fun whileTest(array: Array<Int>){
    var index = 0
    while(index<array.size)
    {
        println(array[index])
        index++
    }
}

fun forTest(vararg  array: Int,hashMap: HashMap<Int,Int>){
    for (i in 0..array.size-1){
        println(array[i])
    }
    //当只有一个参数的时候可以不指定参数名称直接用it代表参数名称
    array.forEach { println(it) }

    for( i in array){
        println(i)
    }

    for((k,v) in hashMap){
        print("$k  $v")
    }
}

fun testNull(s:String?){
    //s可能为null如果要输出s的长度可以这样写
    println(s?.length) //print length or  null
    println(s?:1)//如果为null的话  打印1
    s?.let { println("print") } //如果不为null  则打印
}

fun testwhen(s:String?){
    when(s){
        "haha"-> print("haha")
        null-> println("null")
        else -> println("else")
    }
}

fun tryCatchTest(){
    try {
      throw RuntimeException("error")
    }catch (exception:Exception){
        exception.printStackTrace()
    }
}

//扩展函数 可以在外部增加java任何类的方法  下面给hashmap增加了一个name方法
fun <K,V> java.util.HashMap<K,V>.name():String{
    return "hashmap"
}



/**
 * 内联函数  inline关键字
 * 编译器会优化函数到调用地方 等于同步调用
 * 如果我们使用得当(不内联大函数)，它将在性能上有所提升
 */
inline fun inlineTest(function:()->Int):Int{
    return function()
}

